#ifndef QUICKSELECTOR_H
#define QUICKSELECTOR_H

#include "floatingwidget.h"

#include <QVariant>
#include <QVector>

class QListWidget;
class QListWidgetItem;

namespace vnotex
{
    class LineEdit;

    struct QuickSelectorItem
    {
        QuickSelectorItem() = default;

        QuickSelectorItem(const QVariant &p_key,
                          const QString &p_name,
                          const QString &p_tip,
                          const QString &p_shortcut);

        QVariant m_key;

        QString m_name;

        QString m_tip;

        // Empty or size < 3.
        QString m_shortcut;
    };

    class QuickSelector : public FloatingWidget
    {
        Q_OBJECT
    public:
        QuickSelector(const QString &p_title,
                      const QVector<QuickSelectorItem> &p_items,
                      bool p_sortByShortcut,
                      QWidget *p_parent = nullptr);

        QVariant result() const Q_DECL_OVERRIDE;

    protected:
        bool eventFilter(QObject *p_obj, QEvent *p_event) Q_DECL_OVERRIDE;

    private:
        void setupUI(const QString &p_title);

        void updateItemList();

        void activateItem(const QListWidgetItem *p_item);

        void activate(const QuickSelectorItem *p_item);

        void searchAndFilter(const QString &p_text);

        // Return the number of items that hit @p_judge.
        int filterItems(const std::function<bool(const QuickSelectorItem &)> &p_judge);

        QuickSelectorItem &getSelectorItem(const QListWidgetItem *p_item);

        QVector<QuickSelectorItem> m_items;

        LineEdit *m_searchLineEdit = nullptr;

        QListWidget *m_itemList = nullptr;

        QVariant m_selectedKey;
    };
}

#endif // QUICKSELECTOR_H
